package org.springblade.modules.platform.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springblade.modules.platform.dto.SysParameterDTO;
import org.springblade.modules.platform.entity.SysParameter;
import org.springblade.modules.platform.mapper.SysParameterMapper;
import org.springblade.modules.platform.service.ISysParameterService;
import org.springblade.modules.platform.vo.SysParameterVO;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author SYG
 * @since 2023-08-01
 */
@Service
public class SysParameterServiceImpl extends ServiceImpl<SysParameterMapper, SysParameter> implements ISysParameterService {

    @Override
    public void add(SysParameterDTO sysParameterDTO) {
        List<SysParameterDTO.ParameterDTO> parameterDTOS = sysParameterDTO.getParameterDTOS();
        if(Func.isEmpty(parameterDTOS)){
            return;
        }
        parameterDTOS.forEach(x->{
            List<SysParameterDTO.ParameterDTO.ParameterValueDTO> parameterValueDTOS = x.getParameterValueDTOS();
            parameterValueDTOS.forEach(l->{
                if(l.getId()==null){
                    SysParameter copy = BeanUtil.copy(x, SysParameter.class);
                    copy.setDipXB(l.getDipXB());
                    copy.setDipXK(l.getDipXK());
                    copy.setMaxValue(l.getMaxValue());
                    copy.setMinValue(l.getMinValue());
                    copy.setDeviceChannelId(sysParameterDTO.getDeviceChannelId());
                    copy.setDeviceName(sysParameterDTO.getDeviceName());
                    copy.setUpdateTime(LocalDateTime.now());
                    copy.setInsertTime(LocalDateTime.now());
                    copy.setIsDeleted(0);
                    copy.setMeasuringPlatformId(sysParameterDTO.getMeasuringPlatformId());
                    baseMapper.insert(copy);
                }else {
                    SysParameter copy = BeanUtil.copy(x, SysParameter.class);
                    copy.setId(l.getId());
                    copy.setDipXB(l.getDipXB());
                    copy.setDipXK(l.getDipXK());
                    copy.setMaxValue(l.getMaxValue());
                    copy.setMinValue(l.getMinValue());
                    copy.setDeviceChannelId(sysParameterDTO.getDeviceChannelId());
                    copy.setDeviceName(sysParameterDTO.getDeviceName());
                    copy.setUpdateTime(LocalDateTime.now());
                    copy.setInsertTime(LocalDateTime.now());
                    copy.setIsDeleted(0);
                    copy.setMeasuringPlatformId(sysParameterDTO.getMeasuringPlatformId());
                    baseMapper.updateById(copy);
                }


            });

        });
    }

    @Override
    public void updataSysParameter(SysParameterDTO.ParameterDTO.ParameterValueDTO parameterValueDTO) {
        SysParameter sysParameter = baseMapper.selectById(parameterValueDTO.getId());
        sysParameter.setMaxValue(parameterValueDTO.getMaxValue());
        sysParameter.setMinValue(parameterValueDTO.getMinValue());
        sysParameter.setDipXB(parameterValueDTO.getDipXB());
        sysParameter.setDipXK(parameterValueDTO.getDipXK());
        baseMapper.updateById(sysParameter);
    }

    @Override
    public void removeSysParameter(Long id) {
        baseMapper.deleteById(id);
    }

    @Override
    public SysParameterVO getInfo(Long measuringPlatformId) {
        List<SysParameter> sysParameterList = baseMapper.selectList(Wrappers.<SysParameter>query().lambda()
                .eq(SysParameter::getMeasuringPlatformId, measuringPlatformId));
        if(Func.isEmpty(sysParameterList)){
            return null;
        }
        Map<String, List<SysParameter>> collect = sysParameterList.stream().collect(
                Collectors.groupingBy(SysParameter::getParameterKey, Collectors.toList()));
        String deviceChannelId = sysParameterList.get(0).getDeviceChannelId();
        String deviceName = sysParameterList.get(0).getDeviceName();
        List<SysParameterVO.ParameterVO> parameterVOS = new ArrayList<>();
        collect.forEach((x,y)->{
            SysParameterVO.ParameterVO parameterVO = new SysParameterVO.ParameterVO();
            parameterVO.setParameterKey(x);
            parameterVO.setSensorNumber(y.get(0).getSensorNumber());
            List<SysParameterVO.ParameterVO.ParameterValueVO> parameterValueVOS = new ArrayList<>();
            y.forEach(l->{
                SysParameterVO.ParameterVO.ParameterValueVO parameterValueVO = new SysParameterVO.ParameterVO.ParameterValueVO();
                parameterValueVO.setId(l.getId());
                parameterValueVO.setMaxValue(l.getMaxValue());
                parameterValueVO.setMinValue(l.getMinValue());
                parameterValueVO.setDipXB(l.getDipXB());
                parameterValueVO.setDipXK(l.getDipXK());
                parameterValueVOS.add(parameterValueVO);
            });
            parameterVO.setParameterValueVOS(parameterValueVOS);
            parameterVOS.add(parameterVO);
        });
        return SysParameterVO.builder().measuringPlatformId(measuringPlatformId).deviceName(deviceName).deviceChannelId(deviceChannelId).parameterVOS(parameterVOS).build();
    }
}
